package cn.good.yan.config.t3;

import lombok.Data;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import javax.validation.constraints.NotNull;
import java.util.Optional;

/**
 * 自定义 - 全局过滤器
 *
 * @author shengren.yan
 * @create 2024/3/20
 */

@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {


    /**
     * 自定义 - 全局过滤器，
     * 请求：http://localhost:8080/one/aaa/test1?ver=yy， 会失败， 必须增加消息头 test ，然后进行匹配，成功代表可以访问。
     *
     * @param exchange
     * @param chain
     * @return {@code Mono<Void>}
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 获取请求路径
        System.err.println(String.format("全局过滤器获取到请求路径：%s", exchange.getRequest().getURI()));
        String test = exchange.getRequest().getHeaders().getFirst("test");
        // 无test请求头
        if (!Optional.ofNullable(test).isPresent()) {
            System.err.println("无指定请求头");
            exchange.getResponse().setStatusCode(HttpStatus.BAD_REQUEST);
            return exchange.getResponse().setComplete();
        }
        System.err.println(String.format("请求头参数:%s", test));
        return chain.filter(exchange);

    }

    /**
     * 过滤器存在优先级，order越大，优先级越低
     *
     * @return int
     */
    @Override
    public int getOrder() {
        return 0;
    }


    // 配置类，属性用于接收配置文件中的值
    @Data
    public static class Config {
        // 自定义过滤器的参数
        @NotNull
        private String name;
    }

}
